#!/usr/bin/env python
# coding: utf-8

# In[4]:


# 本案例中大部分绘图使用序列化后数据；相应序列化后数据已提供
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import matplotlib.mlab as mlab
import pickle
import time


# In[5]:


# b 站 2019 年内六月之前发布视频播放数绘制直方图

#序列化数据(播放数)调用
with open(r'data/i.txt', 'rb') as f:
    play = pickle.load(f)
#显示图形
get_ipython().run_line_magic('matplotlib', 'inline')
# 设置matplotlib正常显示中文和负号
matplotlib.rcParams['font.sans-serif']=['SimHei']   # 用黑体显示中文
matplotlib.rcParams['font.sans-serif']=['Songti SC']   # Mac
matplotlib.rcParams['axes.unicode_minus']=False     # 正常显示负号
matplotlib.rcParams['figure.figsize'] = (18.0, 12.0) # 设置figure_size尺寸
# plt.rcParams['figure.dpi'] = 300 #分辨率
# plt.rcParams['savefig.dpi'] = 300 #图片像素

# 直方图       
x = [y/10000 for y in play]
num_bins = 200
n, bins, patches = plt.hist(x, num_bins, facecolor='blue', alpha=0.6) # alpha透明度，浮点数

plt.xscale('linear')
plt.yscale('log') # y 轴 log 刻度
plt.xlabel('视频播放数(单位/万)', fontsize=14)
plt.ylabel('分布', fontsize=14)
plt.title(r'B站19年前五月视频播放数分布', fontsize=15)
plt.savefig(r'picture/B站19年前五月视频播放数分布.png', dpi=300)
plt.show()


# In[6]:


# b 站 2019 年内六月之前发布视频播放数---统计每天

with open(r'data/iday.txt', 'rb') as f: # 发布日期及发布视频数
    send = pickle.load(f) 
send_count = sorted(send.items(), key=lambda item:item[0]) # 每天发布视频数 
x,y = [],[]
for sen in send_count:
    # 时间戳转时间
    timestamp = sen[0]
    time_local = time.localtime(timestamp)
    dt = time.strftime("%m-%d",time_local)# %Y- %H:%M:%S
    x.append(dt) # 发布日期
    y.append(sen[1]) # 次数
x = x[:-5]
y = y[:-5]

#X轴，Y轴数据

plt.figure(figsize=(32,20)) #创建绘图对象
plt.xticks(range(len(x)), x, rotation=90, fontsize=14) # 横坐标
plt.plot(x,y,"b",linewidth=3)   #在当前绘图对象绘图（X轴，Y轴，蓝色虚线'b--'，线宽度）
plt.xlabel("天", fontsize=14) #X轴标签
plt.ylabel("发布视频数量", fontsize=14)  #Y轴标签
plt.title("哔哩哔哩2019年视频发布数",fontsize=16) #图标题

for i,(_x,_y) in enumerate(zip([i for i in range(len(x))],y)):  
    plt.text(_x,_y,y[i],color='red',ha='center', va= 'bottom',fontsize=14,)  #将数值显示在图形上
    
plt.savefig(r'picture/哔哩哔哩2019年视频发布数.png', dpi=300) #指定分辨率保存  
plt.show()  #显示图


# In[7]:


# 前一百标签平均播放量
# 数据
with open(r'data/tags.txt', 'rb') as f:
    tags = pickle.load(f)
with open(r'data/counts.txt', 'rb') as f:
    counts = pickle.load(f)
tag_means = {}
for tag in tags:
    if counts[tag]>=100:
        tag_means[tag] = tags[tag]/counts[tag]
tag_means2 = sorted(tag_means.items(), key=lambda item:item[1], reverse=True) # 标签平均播放量   
x,y2 = [],[]
for tag in tag_means2[:20]:
    x.append(tag[0]) # 标签名
    y2.append(round(tag[1],1)) # 数量, 保留一位小数

y = [round(y3/10000,1) for y3 in y2]
rects = plt.bar(range(len(y)), y, width=0.8, fc='g') # 条形图

plt.xticks(range(len(x)), x, rotation=30, fontsize=14)
plt.xlabel("标签", fontsize=15)
plt.ylabel("平均播放量（单位/万次）", fontsize=15)
plt.title("2019年平均播放量前二十标签",fontsize=16)
# 编辑文本
for rect in rects:
    height = rect.get_height()
    plt.text(rect.get_x() + rect.get_width() / 2, height+1, str(height), ha="center", va="bottom", fontsize=14)
plt.savefig(r'picture/2019年平均播放量前二十标签.png', dpi=300) #指定分辨率保存
plt.show()


# In[8]:


# 前一百标签出现次数
# 数据
with open(r'data/counts.txt', 'rb') as f:
    tag_means = pickle.load(f)
tag_means2 = sorted(tag_means.items(), key=lambda item:item[1], reverse=True) # 标签出现次数  
x,y2 = [],[]
for tag in tag_means2[:20]:
    x.append(tag[0]) # 标签名
    y2.append(round(tag[1],1)) # 出现次数
    
y = [round(y3/10000,2) for y3 in y2]
    
rects = plt.bar(range(len(y)), y, width=0.8, fc='g') # 条形图

plt.xticks(range(len(x)), x, rotation=30,fontsize=15)
plt.yticks(fontsize=15)
plt.xlabel("标签",fontsize=15)
plt.ylabel("次数（单位/万次）",fontsize=15)
plt.title("2019年出现次数前二十标签",fontsize=16)
# 编辑文本
for rect in rects:
    height = rect.get_height()
    plt.text(rect.get_x() + rect.get_width() / 2, height, str(height), ha="center", va="bottom",fontsize=15)
plt.savefig(r'picture/2019年出现次数前二十标签.png', dpi=300) #指定分辨率保存
plt.show()


# In[9]:


# 平均播放与平均弹幕散点图 10w以上
# 数据
with open(r'data/tag_vr.txt', 'rb') as f: # 弹幕
    tag_vr = pickle.load(f)
with open(r'data/10_tag_play.txt', 'rb') as f: # 播放数 ---------改为评论数
    tag_play = pickle.load(f)
with open(r'data/tag_counts.txt', 'rb') as f: # 标签出现次数
    tag_counts = pickle.load(f)
vr_mean = {}
play_mean = {}
for i,tag in enumerate(tag_vr):
    if tag_counts[tag]>50: # 次数
        vr_mean[tag] = tag_vr[tag]/tag_counts[tag] # 生成平均弹幕数字典
        play_mean[tag] = int(tag_play[tag])/tag_counts[tag] # 生成平均播放数字典
# for index,vi in enumerate(vr_mean):
#     if index<=5:
#         print(vr_mean[vi],play_mean[vi])
play_mean2 = sorted(play_mean.items(), key=lambda item:item[1], reverse=False) # 标签平均播放数排序 
print(i,len(vr_mean),len(play_mean))
x,y = [],[]
for index,tag2 in enumerate(play_mean2[:]):
    if index<=3:
        print(tag2,play_mean[tag2[0]],vr_mean[tag2[0]])
    x.append(play_mean[tag2[0]]/1000)
    y.append(vr_mean[tag2[0]]/1000)
print(index)
plt.scatter(x, y, alpha=0.5)
plt.xticks(rotation=90)
plt.xlabel("平均播放数（单位/1000）",fontsize=15)
plt.ylabel("平均弹幕数（单位/1000）",fontsize=15)
plt.title("10w以上平均播放数与弹幕数散点图",fontsize=16)
plt.yscale('log')
plt.xscale('log')
plt.savefig(r'picture/10w以上平均播放数与弹幕数散点图.png', dpi=300) #指定分辨率保存
plt.show()


# In[10]:


# 作者总播放数排行
with open(r'data/author_play.txt', 'rb') as f: # 修改读取文件名即可
    a_play = pickle.load(f)
r_mean2 = sorted(a_play.items(), key=lambda item:item[1], reverse=True) # 作者播放数量排序 ， 降序
    
x,y2 = [],[]
for tag in r_mean2[:20]:
    x.append(tag[0]) # 作者名
    y2.append(round(tag[1],1)) # 作者播放数量, 保留一位小数
y = [round(y3/1000000,2) for y3 in y2]
rects = plt.bar(range(len(y)), y, width=0.8, fc='g') # 条形图

plt.xticks(range(len(x)), x, rotation=30,fontsize=15)
plt.yticks(fontsize=15)
plt.xlabel("作者", fontsize=15)
plt.ylabel("播放数（单位/百万次）",fontsize=15)
plt.title("2019年作者播放数排行",fontsize=16)
plt.yscale('log')
# 编辑文本
for rect in rects:
    height = rect.get_height()
    plt.text(rect.get_x() + rect.get_width() / 2, height+1, str(height), ha="center", va="bottom", fontsize=15)
plt.savefig(r'picture/2019年作者播放数排行.png', dpi=300) #指定分辨率保存
plt.show()


# In[11]:


# 作者粉丝数排行
with open(r'data/author_fllower.txt', 'rb') as f: # 修改读取文件名即可
    a_play = pickle.load(f)
r_mean2 = sorted(a_play.items(), key=lambda item:item[1], reverse=True) # 作者粉丝数量排序 ， 降序
    
x,y2 = [],[]
for tag in r_mean2[:20]:
    x.append(tag[0]) # 作者名
    y2.append(round(tag[1],1)) # 作者粉丝数量, 保留一位小数
y = [round(y3/10000,1) for y3 in y2]
rects = plt.bar(range(len(y)), y, width=0.8, fc='g') # 条形图

plt.xticks(range(len(x)), x, rotation=30,fontsize=15)
plt.xlabel("作者",fontsize=15)
plt.ylabel("粉丝数（单位/万位）",fontsize=15)
plt.title("2019年作者粉丝数排行",fontsize=16)
# 编辑文本
for rect in rects:
    height = rect.get_height()
    plt.text(rect.get_x() + rect.get_width() / 2, height+1, str(height), ha="center", va="bottom", fontsize=14)
plt.savefig(r'picture/2019年作者粉丝数排行.png', dpi=300) #指定分辨率保存
plt.show()


# In[14]:


# 科技区视频标题 词云制作
import jieba.analyse

# 数据生成---------------------------
jieba.load_userdict(r'data/jieba2.txt')
jieba.analyse.set_stop_words(r'data/stop2.txt') 
with open(r'data/title_tech.txt', 'rb' ) as f:
    sentence = f.read()
a = jieba.analyse.extract_tags(sentence, topK=200, withWeight=True, allowPOS=())


# In[13]:


from wordcloud import WordCloud

b = {}
for i,j in a:
    b[i] = j

# wordcloud 部分设置
font_path = r'../zhaozi.ttf' # 字体 # wordcloud设置
x, y = np.ogrid[:600, :600]
mask = (x - 300) ** 2 + (y - 300) ** 2 > 300 ** 2
mask = 255 * mask.astype(int)

# 设置词云属性
wc = WordCloud(font_path=font_path,  # 设置字体
               background_color="white",  # 背景颜色
               max_words=2000,  # 词云显示的最大词数
               mask=mask,  # 设置背景图片
               #contour_width=1, 
               contour_color='green'
               )
# 根据频率生成词云
wc.generate_from_frequencies(b)
wc.to_file(r'picture/科技区标题词云.png') # 保存文件
# 显示图片
plt.figure()
plt.imshow(wc)
plt.axis("off")

plt.show()


# In[ ]:




